package com.yxx.strategy.likeStrategyImpl;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yxx.constant.CommonConstant;
import com.yxx.constant.RedisConstant;
import com.yxx.entity.Comment;
import com.yxx.mapper.CommentMapper;
import com.yxx.service.RedisService;
import com.yxx.strategy.LikeStrategy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * 点赞策略实现
 * @author yuxiangxun
 * @date 2025/2/8
 * @apiNote
 */
@Service("commentLikeStrategyImpl")
public class CommentLikeStrategyImpl implements LikeStrategy {

    @Resource
    private RedisService redisService;

    @Resource
    private CommentMapper commentMapper;



    /**
     * 点赞评论行为实现
     * @param typeId 评论id
     */
    @Override
    public void like(Integer typeId) {
        // 判断该评论是否存在 (评论不存在无法点赞)   或者  判断评论是否通过（未通过的评论无法显示也就无法点赞）  或者  判断评论是否进入回收站  （进入回收站的评论也无法删除）
        Comment comment = commentMapper.selectOne(new LambdaQueryWrapper<Comment>()
                .select(Comment::getId, Comment::getIsCheck)
                .eq(Comment::getId, typeId).last("limit 1"));
        // 断言以上三个条件，成立一个无法通过断言
        Assert.isFalse(Objects.isNull(comment) || comment.getIsCheck().equals(CommonConstant.FALSE), "评论不存在或者文章不通过，无法点赞");
        // 以用户id作为键，评论id作为值，记录用户的点赞记录 （保存到Redis中）
        String userLikeCommentKey = RedisConstant.USER_COMMENT_LIKE + StpUtil.getLoginIdAsInt();
        // 判断是否点过赞吧
        if(redisService.hasSetValue(userLikeCommentKey,typeId)){
            // 存在这一条记录，已经点过赞啦，这里点一次就取消点赞了
            // 取消点赞：删除用户id中的评论id
            redisService.deleteSet(userLikeCommentKey,typeId);
            // 评论的点赞量-1
            redisService.decrHash(RedisConstant.COMMENT_LIKE_COUNT,typeId.toString(),1L);
        }else{
            // 不存在这条记录，证明没有点过赞的，这里点一次就点赞了
            redisService.setSet(userLikeCommentKey,typeId);
            // 评论的点赞量+1
            redisService.incrHash(RedisConstant.COMMENT_LIKE_COUNT,typeId.toString(),1L);
        }



    }
}
